因为做辛卫的作业迅速入门js,但是还是感觉不太清晰,于是上fcc补了这部分,整理了一些笔记,以供参考。

当 JavaScript 中的变量被声明的时候,程序内部会给它一个初始值 undefined。当你对一个值为 undefined 的变量进行运算操作的时候,算出来的结果将会是NaN,NaN 的意思是 “Not a Number”。当你用一个没有定义的变量来做字符串连接操作的时候,它会如实的输出”undefined”。

var a="I am a string";


在 JavaScript 中所有的变量都是大小写敏感的。这意味着你要区别对待大写字母和小写字母。MYVAR与MyVar和myvar 是截然不同的变量。这就有可能导致多个截然不同的变量却有着有相似的名字。正是由于以上原因所以强烈地建议你, 不要 使用这一特性。(以免给自己带来麻烦)最佳实践使用 驼峰命名法 来书写一个 Javascript 变量,在 驼峰命名法 中,变量名的第一个单词的首写字母小写,后面的单词的第一个字母大写。
举个栗子:
var someVariable;
var anotherVariableName;
var thisVariableNameIsTooLong;


在 JavaScript 中的 字符串 要用单引号或双引号来包裹它,只要你在开始和结束都使用相同类型的引号,单引号和双引号的功能在JavaScript中是相同的。


在 JavaScript 中,当 + 操作符与 字符串 一起使用的时候,它被称作连接 操作符。你可以通过和其他字符串连接 来创建一个新的字符串。举个例子:
'My name is Alan,' + ' I concatenate.'
注意空格。连接操作不会添加两个字符串之外的空格,所以想加上空格的话,你需要自己在字符串里面添加。


你可以通过在字符串变量或字符串后面写上 .length 来获得字符串变量 字符串 值的长度。


Use Bracket Notation to Find the First Character in a String

[]叫中括号,{}叫大括号,()叫小括号。JavaScript中只有字符串类型,没有字符类型。那么如何获取到字符串中的某个字符呢?我们通过[索引] 来获得对应的字符。大多数现代编程语言,如JavaScript,不同于人类从1开始计数。它们是从0开始计数,这被称为 基于零 的索引。例如, 在单词 “Charles” 中索引0上的字符为 “C”,所以在 var firstName = “Charles” 中,你可以使用 firstName[0] 来获得第一个位置上的字符。


Understand String Immutability

当你搞懂不可变性后,immutable.js对于你就是小菜一碟了。在 JavaScript 中,字符串 的值是 不可变的,这意味着一旦字符串被创建就不能被改变。例如,下面的代码:var myStr = "Bob";
myStr[0] = “J”;是不会把变量 myStr 的值改变成 “Job” 的,因为变量 myStr 是不可变的。注意,这 并不 意味着 myStr 永远不能被改变,只是字符串字面量 string literal 的各个字符不能被改变。改变 myStr 中的唯一方法是重新给它赋一个值,就像这样:var myStr = "Bob";
myStr = "Job";


Word Blanks

现在,我们来用字符串的相关知识实现一个造句函数。通过使用提供的变量参数:名词myNoun、形容词myAdjective、动词myVerb、副词myAdverb,来创建一个新的句子 result。请注意,在英文中,句中的单词是必须用空格来分隔的举个例子,如果名词为 “dog”,形容词为 “big”,动词为 “run”,副词为”quickly”,那么函数返回值为 “dog big run quickly” 就是没问题的此外,为了句子通顺,你可以在包含所有传入单词的前提下自己添加一些其他单词。对于上面的例子,函数返回值为 “That big brown dog just run quickly” 也是没问题的


Store Multiple Values in one Variable using JavaScript Arrays

使用数组,我们可以在一个地方存储多个数据。你以左方括号[开始定义一个数组,以右方括号]结束定义,并把每个条目之间用逗号隔开,就像这样:var sandwich = [“peanut butter”, “jelly”, “bread”]。任务创建一个包含 字符串 和 数字 的数组 myArray。


你也可以在数组中包含其他数组,就像这样: [[“Bulls”, 23], [“White Sox”, 45]]。这被称为一个 多维数组。


一个简单的方法将数据追加到一个数组的末尾是通过 push() 函数。


改变数组中数据的另一种方法是用 .pop() 函数。.pop() 函数用来”抛出”一个数组末尾的值。我们可以把这个”抛出”的值赋给一个变量存储起来。数组中任何类型的条目(数值,字符串,甚至是数组)可以被”抛出来” 。举个例子, 对于这段代码

var oneDown = [1, 4, 6].pop();
现在 oneDown 的值为 6 ,数组变成了 [1, 4]。


Manipulate Arrays With shiftpop()

函数用来移出数组中最后一个元素。如果想要移出第一个元素要怎么办呢?这就是 .shift() 的用武之地。它的工作原理就像 .pop(),但它移除的是第一个元素,而不是最后一个。


你不仅可以 shift(移出)数组中的第一个元素,你也可以 unshift(移入)一个元素到数组的头部。.unshift() 函数用起来就像 .push() 函数一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素。


Write Reusable JavaScript with Functions

在 JavaScript 中,我们可以把代码的重复部分抽取出来,放到一个函数(functions)中。这是一个函数(function)的例子:

function functionName() {
        console.log("Hello World");
}

调用函数functionName();每次调用函数时它会打印出消息的”Hello World”到开发的控制台上。所有的大括号之间的代码将在每次函数调用时执行。


函数的参数parameters在函数中充当占位符(也叫形参)的作用,参数可以为一个或多个。调用一个函数时所传入的参数为实参,实参决定着形参真正的值。简单理解:形参即形式、实参即内容。这是带有两个参数的函数, param1 和 param2:

function testFun(param1, param2) {
             console.log(param1, param2);
}

接着我们调用 testFun:testFun(“Hello”, “World”);我们传递了两个参数, “Hello” 和 “World”。在函数内部,param1 等于”Hello”,param2 等于”World”。请注意,testFun 函数可以多次调用,每次调用时传递的参数会决定形参的实际值。


Global Scope and Functions

在 JavaScript 中, 作用域 涉及到变量的作用范围。在函数外定义的变量具有 全局 作用域。这意味着,具有全局作用域的变量可以在代码的任何地方被调用。这些没有使用var关键字定义的变量,会被自动创建在全局作用域中,形成全局变量。当在代码其他地方无意间定义了一个变量,刚好变量名与全局变量相同,这时会产生意想不到的后果。因此你应该总是使用var关键字来声明你的变量。


在一个函数内声明的变量,以及该函数的参数都是局部变量,意味着它们只在该函数内可见。这是在函数 myTest内声明局部变量loc 的最佳例子:

function myTest() {
    var loc = "foo";
    console.log(loc);
}
myTest(); // "foo"
console.log(loc); // "undefined"在函数外,loc 是未定义的。

一个程序中有可能具有相同名称的 局部 变量 和 全局 变量。在这种情况下,局部 变量将会优先于 全局 变量。下面为例:

var someVar = "Hat";
function myFun() {
var someVar = "Head";
return someVar;
}

函数 myFun 将会返回 “Head”,因为 局部变量 优先级更高。


Stand in Line

在计算机科学中 队列(queue)是一个抽象的数据结构,队列中的条目都是有秩序的。新的条目会被加到 队列 的末尾,旧的条目会从 队列 的头部被移出。写一个函数 queue ,用一个数组arr和一个数字item作为参数。数字item添加到数组的结尾,然后移出数组的第一个元素,最后队列函数应该返回被删除的元素


Understanding Boolean Values

另一种数据类型是布尔(Boolean)。布尔 值要么是true 要么是false。它非常像电路开关, true是”开”,false 是”关”。这两种状态是互斥的。注意Boolean 值绝不会写作被引号包裹起来的形式。字符串的 “true” 和 “false” 不是 布尔值,在 JavaScript 中也没有特殊含义。


Comparison with the Strict Equality Operator

严格相等运算符(===)是相对于相等操作符(==)的一种操作符。与相等操作符不同的是,它会同时比较元素的值和 数据类型。举个例子3 === 3 // true
3 === ‘3’ // false
3 是一个数字类型的,而’3’ 是一个字符类型的,所以3不全等于’3’。


严格不相等运算符(!==)与全等运算符是相反的。这意味着严格不相等并返回 false 的地方,用严格相等运算符会返回 true,反之亦然。严格相等运算符不会转换值的数据类型。


使用大于运算符(>)来比较两个数字。如果大于运算符左边的数字大于右边的数字,将会返回 true。否则,它返回 false。与相等运算符一样,大于运算符在比较的时候,会转换值的数据类型。


如果你有非常多的选项需要选择,可以使用switch语句。根据不同的参数值会匹配上不同的case分支,语句会从第一个匹配的case分支开始执行,直到碰到break就结束。这是一个伪代码案例:

switch (num) {
    case value1:
    statement1;
    break;
    case value2:
    statement2;
    break;
    ...
    case valueN:
    statementN;
    break;
}

测试case 值使用严格相等运算符进行比较,break关键字告诉javascript停止执行语句。如果没有break关键字,下一个语句会继续执行。


Adding a default option in Switch statements

在switch 语句中你可能无法用case来指定所有情况,这时你可以添加default语句。当再也找不到case匹配的时候default语句会执行,非常类似于if/else组合中的else语句。default语句应该是最后一个case。

switch (num) {
    case value1:
    statement1;
    break;
    case value2:
    statement2;
    break;
    ...
    default:
    defaultStatement;
}

Build JavaScript Objects

你之前可能听说过对象 object 。对象和数组很相似,数组是通过索引来访问和修改数据,对象是通过属性来访问和修改数据的。这是一个示例对象:

var cat = {
    "name": "Whiskers",
    "legs": 4,
    "tails": 1,
    "enemies": ["Water", "Dogs"]
};

对象适合用来存储结构化数据,就和真实世界的对象一模一样,比如一只猫。


Accessing Objects Properties with the Dot Operator

有两种方式访问对象属性,一个是点操作符(.),一个是中括号操作符([])。当你知道属性的名称的时候,使用点操作符。这是一个使用点操作符读取对象属性的例子:

var myObj = {
    prop1: "val1",
    prop2: "val2"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2任务通过点操作符读取对象testObj,把hat的属性值赋给变量hatValue,把shirt的属性值赋给shirtValue。

Accessing Objects Properties with Bracket Notation

第二种访问对象的方式就是中括号操作符([]),如果你想访问的属性的名称有一个空格,这时你只能使用中括号操作符([])。这是一个使用中括号操作符([])读取对象属性的例子:

var myObj = {
    "Space Name": "Kirk",
    "More Space": "Spock"
};
myObj["Space Name"]; // Kirk
myObj['More Space']; // Spock提示:属性名称中如果有空格,必须把属性名称用单引号或双引号包裹起来。

中括号操作符的另一个使用方式是用变量来访问一个属性。当你需要遍历对象的属性列表或查表时,这种方式极为有用。

这有一个使用变量来访问属性的例子:

var someProp = "propName";
var myObj = {
  propName: "Some Value"
}
myObj[someProp]; // "Some Value"

还有更多:

var myDog = "Hunter";
var dogs = {
  Fido: "Mutt",
  Hunter: "Doberman",
  Snoopie: "Beagle"
}
var breed = dogs[myDog]; 
console.log(breed)// "Doberman"

提示:当我们通过变量名访问属性的时候,不需要给变量名包裹引号。因为实际上我们使用的是变量的值,而不是变量的名称。


添加可以直接添加
我们同样可以删除对象的属性,例如:delete ourDog.bark;


对象和字典一样,可以用来存储键/值对。如果你的数据跟对象一样,你可以用对象来查找你想要的值,而不是使用switch或if/else语句。当你知道你的输入数据在某个范围时,这种查找方式极为有效。这是简单的反向字母表:

var alpha = {
    1:"Z",
    2:"Y",
    3:"X",
    4:"W",
    ...
    24:"C",
    25:"B",
    26:"A"
};
alpha[2]; // "Y"
alpha[24]; // "C"
var value = 2;
alpha[value]; // "Y"

Testing Objects for Properties

有时检查一个对象属性是否存在是非常有用的,我们可以用.hasOwnProperty(propname)方法来检查对象是否有该属性。如果有返回true,反之返回 false。举例:

var myObj = {
    top: "hat",
    bottom: "pants"
};
myObj.hasOwnProperty("top"); // true
myObj.hasOwnProperty("middle"); // false任务修改函数checkObj检查myObj
是否有checkProp属性,如果属性存在,返回属性对应的值,如果不存在,返回 "Not Found"。

注意:如果你需要通过变量来访问对象的属性值,请用中括号操作符,点操作符不支持变量。


Introducing JavaScript Object Notation JSON

JavaScript Object Notation 简称 JSON,它使用JavaScript对象的格式来存储数据。JSON是灵活的,因为它允许 数据结构 是 字符串,数字,布尔值,字符串,和 对象 的任意组合。这里是一个JSON对象的示例:

var ourMusic = [
{
    "artist": "Daft Punk",
    "title": "Homework",    
    "release_year": 1997,
    "formats": [
            "CD",
            "Cassette",
            "LP" ],
    "gold": true
}
];

这是一个对象数组,并且对象有各种关于专辑的 详细信息。它也有一个嵌套的 formats 的数组。附加专辑记录可以被添加到数组的最上层。提示
数组中有多个 JSON 对象的时候,对象与对象之间要用逗号隔开。


Accessing Nested Objects in JSON

通过串联起来的点操作符或中括号操作符来访问JSON对象的嵌套属性。下面是一个嵌套的JSON对象:

var ourStorage = {
    "desk": {
       "drawer": "stapler"
    },
    "cabinet": {
        "top drawer": {
            "folder1": "a file",
            "folder2": "secrets"
            },
        "bottom drawer": "soda"
        }
    }
ourStorage.cabinet["top drawer"].folder2; // "secrets"
ourStorage.desk.drawer; // "stapler"

正如我们在前面的例子所见,JSON对象可以嵌套对象和数组。与访问嵌套对象一样,用中括号操作符同样可以访问嵌套数组。下面是如何访问嵌套数组的例子:

var ourPets = {
      "cats": [
            "Meowzer",
            "Fluffy",
            "Kit-Cat"
            ],
      "dogs": [
            "Spot",
            "Bowser",
            "Frankie"
        ]
};
ourPets.cats[1]; // "Fluffy"
ourPets.dogs[0]; // "Spot"

Iterate with JavaScript For Loops

一个条件语句只能执行一次代码,而一个循环语句可以多次执行代码。JavaScript 中最常见的循环就是”for循环”。for循环中的三个表达式用分号隔开:for ([初始化]; [条件判断]; [计数器])初始化语句只会在执行循环开始之前执行一次。它通常用于定义和设置你的循环变量。条件判断语句会在每一轮循环的开始执行,只要条件判断为 true 就会继续执行循环。当条件为 false的时候,循环将停止执行。这意味着,如果条件在一开始就为 false,这个循环将不会执行。计数器是在每一轮循环结束时执行,通常用于递增或递减。在下面的例子中,先初始化i = 0,条件 i < 5 为真,进入第一次循环,执行大括号里的代码,第一次循环结束。递增i的值,条件判断,就这样依次执行下去,直到条件判断为假,整个循环结束。

var ourArray = [];
for (var i = 0; i < 5; i++) {
ourArray.push(i);
}

最终 ourArray 的值为 [0,1,2,3,4].


Nesting For Loops

如果你有一个二维数组,可以使用相同的逻辑,先遍历外面的数组,再遍历里面的子数组。下面是一个例子:

var arr = [
[1,2], [3,4], [5,6]
];
for (var i=0; i < arr.length; i++) {
    for (var j=0; j < arr[i].length; j++) {
        console.log(arr[i][j]);
}
}

一次输出 arr 中的每个子元素。提示,对于内部循环,我们可以通过 arr[i] 的 .length 来获得子数组的长度,因为 arr[i] 的本身就是一个数组。


Generate Random Fractions with JavaScript

计算机的行为只有两种:确定性和随机性。当你一步步地闯关来到这里就是确定行为,当你随意点了个链接就来到这里就是随机行为。而随机数最适合用来创建这种随机行为。Math.random()用来生成一个在0(包括0)到1(不包括1)之间的随机小数,因此Math.random()可能返回0但绝不会返回1。提示
随后的函数都会在return执行前调用,所以我们可以直接返回Math.random()的值。任务更改myFunction 来生成一个随机数取代 0。


Sift through Text with Regular Expressions

Regular expressions 正则表达式被用来根据某种匹配模式来寻找strings中的某些单词。

举例:如果我们想要找到字符串The dog chased the cat中单词 the,我们可以使用下面的正则表达式: /the/gi
我们可以把这个正则表达式分成几段:
/ 是这个正则表达式的头部
the 是我们想要匹配的模式
/ 是这个正则表达式的尾部
g 代表着 global(全局),意味着返回所有的匹配而不仅仅是第一个。
i 代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。


Find Numbers with Regular Expressions

我们可以在正则表达式中使用特殊选择器来选取特殊类型的值。特殊选择器中的一种就是数字选择器\d,意思是被用来获取一个字符串的数字。在JavaScript中, 数字选择器类似于: /\d/g。在选择器后面添加一个加号标记(+),例如:/\d+/g,它允许这个正则表达式匹配一个或更多数字。尾部的g是’global’的简写,意思是允许这个正则表达式 找到所有的匹配而不是仅仅找到第一个匹配。